package queue;

/**
 * 使用数组实现循环队列
 */
public class CircleQueueDemo {


}

class CircleQueue{
    private int maxSize;//队列长度
    private int rear;//队列尾
    private int front;//队列头
    private int queue[]; //用数组代表循环队列

    public CircleQueue(int maxSize){
        this.maxSize=maxSize;
        this.queue=new int[maxSize];
//        this.front=0; 默认值为0
//        this.rear=0;
    }

    //判断队列是否已满
    public boolean isFull(){
        return (rear+1)%maxSize==front;
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return rear==front;
    }

    //入队操作
    //从队列尾入队
    public void addQueue(int val){
        //判断队列是否已满
        if (isFull()){
            System.out.println("队列已满，不能入队");
        }else{
//            rear++;
//            queue[rear]=val;
            //此时的rear指向的就是一个空的地址空间，直接赋值，然后rear后移
            queue[rear]=val;
            //因为是循环队列，所以要避免rear超出队列长度-1
            rear=(rear+1)%maxSize;
        }
    }

    //出队操作
    public int outQueue(){
        //判断队列是否为空
        if (isEmpty()){
            throw new RuntimeException("队列为空，出队操作失败");
        }else{
            //因为此时front指向的是队列头的前一个位置，所以front要先自增，才能到队列头的位置
//            front++;
//            return queue[front];
            //因为此时的front指向的就是队列头，所以直接输出
            int val=queue[front];
            //front后移,同样要避免front超出队列长度-1
            front=(front+1)%maxSize;
            return val;

        }
    }

    //获取队列的有效长度
    public int getLen(){
        return (rear+maxSize-front)%maxSize;
    }

    //遍历队列
    public void  getQueue(){
        //从队列头开始遍历，遍历到front+队列长度
        for (int i = front; i < front+getLen(); i++) {
            System.out.println("queue["+i%maxSize+"]="+queue[i%maxSize]);
        }
    }




}
